﻿using UnityEngine;
using System.Collections;

/// <summary>
/// 이벤트를 다른 오브젝트로 보낸다.
/// </summary>
[AddComponentMenu("wsLibrary/Util/Event Sender")]
public class wsEventSender : MonoBehaviour
{
    /// <summary>
    /// 이벤트를 무조건 루트 오브젝트로 보낸다.
    /// 자신이 루트일 경우에는 보내지 않는다.
    /// </summary>
    public bool sendToRoot = false;

    /// <summary>
    /// 이벤트를 보낼 오브젝트. (sendToRoot가 false일 경우에만 사용된다.)
    /// </summary>
    public GameObject target;

    /// <summary>
    /// 트리거 시작 이벤트를 처리할 함수 이름.
    /// </summary>
    public string triggerEnter = "OnTriggerEnter";

    /// <summary>
    /// 트리거 종료 이벤트를 처리할 함수 이름.
    /// </summary>
    public string triggerExit = "OnTriggerExit";

    /// <summary>
    /// 충돌 시작 이벤트를 처리할 함수 이름.
    /// </summary>
    public string collisionEnter = "OnCollisionEnter";

    /// <summary>
    /// 충돌 종료 이벤트를 처리할 함수 이름.
    /// </summary>
    public string collisionExit = "OnCollisionExit";

	/// <summary>
	/// 마우스 릴리즈 이벤트를 처리할 함수 이름.
	/// </summary>
	public string mouseUp = "OnMouseUp";

    /// <summary>
    /// 마우스 클릭 이벤트를 처리할 함수 이름.
    /// </summary>
    public string mouseDown = "OnMouseDown";

	/// <summary>
	/// 마우스 오버 시작 이벤트를 처리할 함수 이름.
	/// </summary>
	public string mouseEnter = "OnMouseEnter";

	/// <summary>
	/// 마우스 오버 이벤트를 처리할 함수 이름.(매 프레임마다 실행된다.)
	/// </summary>
	public string mouseOver = "OnMouseOver";

	/// <summary>
	/// 마우스 아웃 이벤트를 처리할 함수 이름.
	/// </summary>
	public string mouseExit = "OnMouseExit";

    void SendEvent(string methodName)
    {
        if (methodName.Length == 0) return;

        if (sendToRoot)
        {
            if (transform != transform.root)
                transform.root.SendMessage(methodName, SendMessageOptions.DontRequireReceiver);
        }
        else
        {
            if (target != null)
                target.SendMessage(methodName, SendMessageOptions.DontRequireReceiver);
        }
    }

    void SendEvent(string methodName, object data)
    {
        if (methodName.Length == 0) return;

        if (sendToRoot)
        {
            if (transform != transform.root)
				transform.root.SendMessage(methodName, data, SendMessageOptions.DontRequireReceiver);
        }
        else
        {
            if (target != null)
				target.SendMessage(methodName, data, SendMessageOptions.DontRequireReceiver);
        }
    }

    void OnTriggerEnter(Collider col)
    {
		this.SendEvent(triggerEnter, col);
    }

    void OnTriggerExit(Collider col)
    {
		this.SendEvent(triggerExit, col);
    }

    void OnCollisionEnter(Collision col)
    {
		this.SendEvent(collisionEnter, col);
    }

    void OnCollisionExit(Collision col)
    {
		this.SendEvent(collisionExit, col);
    }

	void OnMouseUp()
	{
		this.SendEvent(mouseUp);
	}

    void OnMouseDown()
    {
		this.SendEvent(mouseDown);
    }

	void OnMouseEnter()
	{
		this.SendEvent(mouseEnter);
	}

	void OnMouseOver()
	{
		this.SendEvent(mouseOver);
	}

	void OnMouseExit()
	{
		this.SendEvent(mouseExit);
	}
}
